home *** CD-ROM | disk | FTP | other *** search
- /*
- * Visual Basic Callback Server Source
- *
- * (c) Copyright Microsoft Corp. 1995 All Rights Reserved
- */
-
- #include "hostenv.h"
- #include "svrmain.h"
- #include "BaseDisp.h"
- #include "CBackODL.h"
-
- /*Support function for deriving*/
- void CBaseIDispatch::Derive(CBaseIDispatch FAR* pDest, CBaseIDispatch FAR* pSource)
- {
- if (pSource)
- {
- CBaseIDispatch &refDest = *pDest;
- CBaseIDispatch &refSrc = *pSource;
- if (refSrc.m_pSupportErrorInfo)
- {
- refDest.m_pSupportErrorInfo = refSrc.m_pSupportErrorInfo;
- refDest.m_pSupportErrorInfo->AddRef();
- }
- }
- }
- /*CBaseIDispatch: base implementation to support IDispatch*/
- CBaseIDispatch::CBaseIDispatch()
- {
- m_refs = 0;
- m_pIID = &IID_NULL;
- m_ptinfo = NULL;
- m_pSupportErrorInfo = NULL;
- g_cObj++;
- }
- CBaseIDispatch::~CBaseIDispatch()
- {
- if (m_ptinfo)
- m_ptinfo->Release();
- if (m_pSupportErrorInfo)
- m_pSupportErrorInfo->Release();
- g_cObj--;
- }
- STDMETHODIMP
- CBaseIDispatch::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
- {
- if (IIDOK(IUnknown) || IIDOK(IDispatch) || IsEqualIID(riid, *m_pIID))
- {
- *ppvObj = this;
- }
- else if (m_pSupportErrorInfo && IIDOK(ISupportErrorInfo))
- {
- return m_pSupportErrorInfo->QueryInterface(riid, ppvObj);
- }
- else if (IIDOK(IProvideClassInfo))
- {
- HRESULT hr;
- if SUCCEEDED(hr = LoadTypeInfo())
- return CProvideClassInfo::Create(m_ptinfo, (CProvideClassInfo FAR* FAR*) ppvObj);
- else
- return hr;
- }
- else
- {
- *ppvObj = NULL;
- return ResultFromScode(E_NOINTERFACE);
- }
- AddRef();
- return NOERROR;
- }
- STDMETHODIMP_(ULONG)
- CBaseIDispatch::AddRef(void)
- {
- return ++m_refs;
- }
- STDMETHODIMP_(ULONG)
- CBaseIDispatch::Release(void)
- {
- if(--m_refs == 0)
- {
- delete this;
- return 0;
- }
- return m_refs;
- }
- /* IDispatch methods */
- STDMETHODIMP
- CBaseIDispatch::GetTypeInfoCount(UINT FAR* pctinfo)
- {
- *pctinfo = 1;
- return NOERROR;
- }
-
- STDMETHODIMP
- CBaseIDispatch::GetTypeInfo(
- UINT itinfo,
- LCID lcid,
- ITypeInfo FAR* FAR* pptinfo)
- {
-
- HRESULT hr;
- if SUCCEEDED( hr = LoadTypeInfo() )
- {
- m_ptinfo->AddRef();
- *pptinfo = m_ptinfo;
- }
- else
- *pptinfo = NULL;
-
- return hr;
- }
-
- STDMETHODIMP
- CBaseIDispatch::GetIDsOfNames(
- REFIID riid,
- OLECHAR FAR* FAR* rgszNames,
- UINT cNames,
- LCID lcid,
- DISPID FAR* rgdispid)
- {
- HRESULT hr;
- if (riid != IID_NULL)
- hr = ResultFromScode(DISP_E_UNKNOWNINTERFACE);
- else if SUCCEEDED( hr = LoadTypeInfo() )
- hr = DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid);
- return hr;
- }
- STDMETHODIMP
- CBaseIDispatch::Invoke(
- DISPID dispidMember,
- REFIID riid,
- LCID lcid,
- WORD wFlags,
- DISPPARAMS FAR* pdispparams,
- VARIANT FAR* pvarResult,
- EXCEPINFO FAR* pexcepinfo,
- UINT FAR* puArgErr)
- {
- HRESULT hr;
- if (riid != IID_NULL)
- hr = ResultFromScode(DISP_E_UNKNOWNINTERFACE);
- else if SUCCEEDED( hr = LoadTypeInfo() )
- hr = DispInvoke(this, m_ptinfo, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
- return hr;
- }
-
- HRESULT CBaseIDispatch::LoadTypeInfo()
- {
- HRESULT hr;
- if (m_ptinfo)
- hr = NOERROR;
- else
- hr = LoadResourceTypeLib(LIBID_VBCallBack, *m_pIID, &m_ptinfo);
- return hr;
- }
-
- /*CProvideClassInfo implementation*/
- HRESULT CProvideClassInfo::Create(ITypeInfo FAR* ptinfo, CProvideClassInfo FAR* FAR* retVal)
- {
- if (NULL == (*retVal = new CProvideClassInfo()))
- return ResultFromScode(E_OUTOFMEMORY);
- else
- {
- (*retVal)->m_ptinfo = ptinfo;
- ptinfo->AddRef();
- (*retVal)->AddRef();
- return NOERROR;
- }
- }
- CProvideClassInfo::CProvideClassInfo()
- {
- m_refs = 0;
- g_cObj++;
- }
- CProvideClassInfo::~CProvideClassInfo()
- {
- if (m_ptinfo)
- m_ptinfo->Release();
- g_cObj--;
- }
- STDMETHODIMP
- CProvideClassInfo::QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj)
- {
- if (IIDOK(IProvideClassInfo) || IIDOK(IUnknown))
- {
- *ppvObj = this;
- }
- else
- {
- *ppvObj = NULL;
- return ResultFromScode(E_NOINTERFACE);
- }
- AddRef();
- return NOERROR;
- }
- STDMETHODIMP_(ULONG)
- CProvideClassInfo::AddRef(void)
- {
- return ++m_refs;
- }
- STDMETHODIMP_(ULONG)
- CProvideClassInfo::Release(void)
- {
- if(--m_refs == 0)
- {
- delete this;
- return 0;
- }
- return m_refs;
- }
- STDMETHODIMP
- CProvideClassInfo::GetClassInfo(THIS_ LPTYPEINFO FAR* ppTI)
- {
- if (m_ptinfo)
- {
- m_ptinfo->AddRef();
- *ppTI = m_ptinfo;
- return NOERROR;
- }
- else
- {
- *ppTI = NULL;
- return ResultFromScode(E_FAIL);
- }
- }
-